package com.altran.web.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.PersistenceException;

import com.altran.web.model.Concepto;
import com.altran.web.model.Consultor;

public class GestionDedicacionesServImpl implements GestionDedicacionServ {
	
	public static EntityManagerFactory factory =
			Persistence.createEntityManagerFactory("data");

	@Override
	public void crearConsultor(String nombre, String telefono, String email) {
		
		EntityManager em = null; 
				
		try {
			em = factory.createEntityManager();
			EntityTransaction tx = em.getTransaction();
			tx.begin();
			Consultor consultor = new Consultor(nombre, telefono, email); 
			em.persist(consultor);
			tx.commit();
			
		} finally {
			if(em!=null) {
				em.close();
			}
		}

	}

	@Override
	public void modificarConsultor(int id_consultor, String nombre, String telefono, String email) {

		EntityManager em = null;
		try {
			em = factory.createEntityManager();
			EntityTransaction tx = em.getTransaction();
			tx.begin();
			
//			Consultor consultor = em.find(Consultor.class, nombre);
			Consultor consultor = em.getReference(Consultor.class, id_consultor);
			consultor.setNombre(nombre);
			consultor.setEmail(email);
			consultor.setTelf(telefono);
			em.persist(consultor);
			tx.commit();
			
		} catch (NoResultException exc) {
			throw new NoResultException("No se ha podido actualizar el consultor. \n" + exc.getMessage());
		} finally {
			if (em != null) {
				em.close();
			}
		}
	}

	@Override
	public void crearConcepto(String nombre) {
		EntityManager em = null; 
		
		try {
			em = factory.createEntityManager();
			EntityTransaction tx = em.getTransaction();
			tx.begin();
			Concepto concepto = new Concepto(nombre);
			em.persist(concepto);
			tx.commit();
			
		} catch (PersistenceException exc) {
			throw new PersistenceException("No se ha podido crear el concepto " + nombre + ".", exc);
		}
		
		finally {
			if(em!=null) {
				em.close();
			}
		}

		
	}

	@Override
	public void modificarConcepto(int id_concepto, String nombre) {
		EntityManager em = null;
		try {
			em = factory.createEntityManager();
			EntityTransaction tx = em.getTransaction();
			tx.begin();
			
//			Consultor consultor = em.find(Consultor.class, nombre);
			Concepto concepto = em.getReference(Concepto.class, id_concepto);
			concepto.setNombre(nombre);
			em.persist(concepto);
			tx.commit();
			
		} catch (NoResultException exc) {
			throw new NoResultException("No se ha podido actualizar el concepto. \n" + exc.getMessage());
		} finally {
			if (em != null) {
				em.close();
			}
		}
	}

	@Override
	public Consultor buscarConsultorByNombre(String nombre) {
		EntityManager em = null;
		Consultor consultor = null;
		
		try {
			em = factory.createEntityManager();
			
			consultor = (Consultor) em.createQuery("from Consultor"+
						   " where nombre = :nombre")
						   .setParameter("nombre", nombre)
						   .getSingleResult();
			
		} catch (NoResultException exc) {
			/*Si no encuentra el consultor a modificar, controlamos la excepción y enviamos referencia nula*/
		} finally {
			if (em != null) {
				em.close();
			}
		}
		return consultor;
	}
	
	@Override
	public Consultor buscarConsultorById(int id) {
		EntityManager em = null;
		Consultor consultor = null;
		
		try {
			em = factory.createEntityManager();
			consultor = em.getReference(Consultor.class, id);
			
		} catch (NoResultException exc) {
			/*Si no encuentra el consultor a modificar, controlamos la excepción y enviamos referencia nula*/
		} finally {
			if (em != null) {
				em.close();
			}
		}
		
		return consultor;
	}
	
	


}
